package com.atguigu.jxc.controller;

import com.atguigu.jxc.domain.ServiceVO;
import com.atguigu.jxc.entity.Goods;
import com.atguigu.jxc.service.GoodsService;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.websocket.server.PathParam;
import java.util.Map;
import java.util.ServiceConfigurationError;

/**
 * @description 商品信息Controller
 */
@Controller
@RequestMapping("goods")
public class GoodsController {

    @Autowired
    private GoodsService goodsService;

    /**
     * 分页查询商品库存信息
     * @param page 当前页
     * @param rows 每页显示条数
     * @param codeOrName 商品编码或名称
     * @param goodsTypeId 商品类别ID
     * @return
     */
    @PostMapping("/listInventory")
    @ResponseBody
    public Map<String, Object> list(
            @RequestParam(value = "page") Integer page,
            @RequestParam(value = "rows") Integer rows,
            @RequestParam(value = "codeOrName" , required = false) String codeOrName,
            @RequestParam(value = "goodsTypeId" , required = false) Integer goodsTypeId) {
        return goodsService.listIndexStock(page, rows, codeOrName,goodsTypeId);
    }


    /**
     * 分页查询商品信息
     * @param page 当前页
     * @param rows 每页显示条数
     * @param goodsName 商品名称
     * @param goodsTypeId 商品类别ID
     *
     *请求URL：http://localhost:8080/goods/list
     * 请求参数：Integer page, Integer rows, String goodsName, Integer goodsTypeId
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：Map<String,Object>
     * @return
     */
    @PostMapping("/list")
    @ResponseBody
    public Map<String,Object> getPageGoodsList(
            @RequestParam("page") Integer page,
            @RequestParam("rows") Integer rows,
            @RequestParam(value = "goodsName", required = false) String goodsName,
            @RequestParam(value = "goodsTypeId", required = false)Integer goodsTypeId){
        return goodsService.getPageGoodsList(page,rows,goodsName,goodsTypeId);
    }



    /**
     * 生成商品编码
     * @return
     */
    @RequestMapping("/getCode")
    @RequiresPermissions(value = "商品管理")
    public ServiceVO getCode() {
        return goodsService.getCode();
    }

    /**
     * 添加或修改商品信息
     * @param goods 商品信息实体
     * @return
     */
    /*
    * 请求URL：http://localhost:8080/goods/save?goodsId=37
        请求参数：Goods goods
        请求方式：POST
        * 返回值类型：JSON
        返回值：ServiceVO
    * */
    @PostMapping("/save")
    @ResponseBody
    public ServiceVO saveGoods(Goods goods){
        return goodsService.saveGoods(goods);
    }

    /**
     * 删除商品信息
     * @param goodsId 商品ID
     * @return
     *
     * 请求URL：http://localhost:8080/goods/delete
     * 请求参数：Integer goodsId
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：ServiceVO
     */
    @PostMapping("/delete")
    @ResponseBody
    public ServiceVO deleteGoods(@RequestParam("goodsId") Integer goodsId){
        return goodsService.deleteGoods(goodsId);
    }

    /**
     * 分页查询无库存商品信息
     * @param page 当前页
     * @param rows 每页显示条数
     * @param nameOrCode 商品名称或商品编码
     * @return
     *
     * 请求URL：http://localhost:8080/goods/getNoInventoryQuantity
     * 请求参数：Integer page,Integer rows,String nameOrCode
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：Map<String,Object>
     */
    @PostMapping("/getNoInventoryQuantity")
    @ResponseBody
    public Map<String,Object> getPageNoInQuGoods(
            @RequestParam("page") Integer page,
            @RequestParam("rows") Integer rows,
            @RequestParam(value = "nameOrCode", required = false) String nameOrCode){
        return goodsService.getPageNoInQuGoods(page,rows,nameOrCode);
    }



    /**
     * 分页查询有库存商品信息
     * @param page 当前页
     * @param rows 每页显示条数
     * @param nameOrCode 商品名称或商品编码
     * @return
     *
     * 请求URL：http://localhost:8080/goods/getHasInventoryQuantity
     * 请求参数：Integer page,Integer rows,String nameOrCode
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：Map<String,Object>
     */
    @PostMapping("/getHasInventoryQuantity")
    @ResponseBody
    public Map<String,Object> getPageHasInQuGoods(
            @RequestParam("page") Integer page,
            @RequestParam("rows") Integer rows,
            @RequestParam(value = "nameOrCode", required = false) String nameOrCode){
        return goodsService.getPageHasInQuGoods(page,rows,nameOrCode);
    }


    /**
     * 添加商品期初库存
     * @param goodsId 商品ID
     * @param inventoryQuantity 库存
     * @param purchasingPrice 成本价
     * @return
     *
     * 请求URL：http://localhost:8080/goods/saveStock?goodsId=25
     * 请求参数：Integer goodsId,Integer inventoryQuantity,double purchasingPrice
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：ServiceVO
     */
    @PostMapping("/saveStock")
    @ResponseBody
    public ServiceVO saveStock(
            @PathParam("goodsId") Integer goodsId,
            @PathParam("inventoryQuantity") Integer inventoryQuantity,
            @PathParam("purchasingPrice") double purchasingPrice){
        return goodsService.saveStock(goodsId,inventoryQuantity,purchasingPrice);
    }

    /**
     * 删除商品库存
     * @param goodsId 商品ID
     * @return
     *
     * 请求URL：http://localhost:8080/goods/deleteStock
     * 请求参数：Integer goodsId
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：ServiceVO
     */
    @PostMapping("/deleteStock")
    @ResponseBody
    public ServiceVO deleteStock(@PathParam("goodsId") Integer goodsId){
        return goodsService.deleteStock(goodsId);
    }

    /**
     * 查询库存报警商品信息
     * @return
     *
     * 请求URL：http://localhost:8080/goods/listAlarm
     * 请求参数：无
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：Map<String,Object>
     */
    @PostMapping("/listAlarm")
    @ResponseBody
    public Map<String,Object> getListAlarm(){
        return goodsService.getListAlarm();
    }

}
